//
//  YNSLRoster.h
//  Messenger
//
//  Created by iOS on 14/12/24.
//  Copyright (c) 2014年 孙浪. All rights reserved.
//
//  用户名册管理类
//

#import "XMPPModule.h"

#if !TARGET_OS_IPHONE
#import <Cocoa/Cocoa.h>
#endif

#import "XMPP.h"
#import "XMPPUser.h"
#import "XMPPResource.h"
#import "YNXMPPprotocol.h"
#import "YNIMFrameworkTypedef.h"

@class DDList;
@class XMPPIDTracker;

@interface YNSLRoster : XMPPModule
{
    XMPPIDTracker *xmppIDTracker;
    Byte config;
    Byte flags;
    DDList *mucModules;
}
//组织机构信息是否已经拉取和保存完毕
@property(nonatomic,assign)BOOL contactOrgDataIsSaveing;
/*
 * 自动获取所有联系人
 */
@property (assign) BOOL autoFetchRoster;

/*
 * 外部通过这个属性获知roster组织机构是否开始请求数据
 */
@property (assign, getter=hasRequestedRoster, readonly) BOOL requestedRoster;

/**
 * 外部通过这个属性获知数据库是否填充完毕
 **/
@property (assign, getter=isPopulating, readonly) BOOL populating;

/*
 * 外部通过这个属性获知数据是否获取成功
 */
@property (assign, readonly) BOOL hasRoster;

/**
 * 初始化
 */
- (id)initWithRosterDispatchQueue:(dispatch_queue_t)queue;

- (instancetype)initWithCode:(NSString*)code userId:(NSString*)userId delegate:(id<YNXMPPprotocol>)delegate;

/**
 * 初始化Message信息
 * 先获取初始化信息, 然后再调用fetchRoster
 **/
- (void)MessageInit;

//搜索自己的账户
- (void)searchMeInfomationWithNo:(NSString*)userNo;

/**
 * 手动从服务器获取联系人，关闭autoFetchRoster才有用
 * 
 **/
- (void)fetchRoster;

//手动获取群成员和群信息
- (void)fetchGroupInfo;

//手动获取讨论组成员和信息
- (void)fetchDiscussionGroupInfo;

/*
 *手动获取组织机构和群讨论组等信息
 */
- (void)manualFetchUserData;
/**
 * (不用实现，没法设置)
 * 设置/修改获取的联系人的昵称(不用实现，没法设置)
 **/
- (void)setNickname:(NSString *)nickname forUser:(XMPPJID *)jid;

/**
 * 依能新增Message方法和功能
 * 上面的有些功能不用实现，写出来就是为了方便以后好扩展，
 * 本身就是基于XMPPRoster的功能实现，只是让他更符合Message实情
 **/

/**
 * 修改本人信息，只能修改电话号码和电子邮件
 * jid是自己的jid,只能是自己的
 * dic 是修改信息的字典 例如：
 * {"telephone":"13800000000","email":".moumou.yn.com.cn"}
 *
 **/
- (void)modifyUsInfoTo:(XMPPJID *)jid detailedInfo:(NSDictionary *)dic;

/**
 * 查找用户或获取某个用户的详细信息
 * 接口文档里面是根据UserNo获取信息
 * 这里是通过JID获取信息获取信息，等实现的时候决定用哪种
 **/
- (void)searchDetailedInfomationOfAUser:(NSString *)userId;

/**HX** 同步会话列表 **/
- (void)synchronizationSessionList;


/**
 *
 * 获取初始化信息成功后，获取组织机构，群，讨论组等等信息.
 *
 *
 */
- (void)fetchRosterData;

/**
 获取漫游消息记录
 黄旭 2017-12-04
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/群id，广播传空
 @param msgCount 拉取消息条数 正数为向上拉取，负数为向下拉取
 @param sendTime 消息时间，为空时拉取最新的几条数据，格式为："2017-11-30 17:12:12.20" 精确到毫秒
 @param isMessageNewListDat YES:消息列表拉取的消息漫游，NO：不是消息列表拉取的消息漫游
 */
-(void)getRoamMessageRecordWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId msgCount:(NSInteger)msgCount sendTime:(NSString*)sendTime isMessageNewListDat:(BOOL)isMessageNewListDat;

/**
 漫游删除会话列表的会话消息
 黄旭 2017-12-13
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/群id，广播消息没有删除操作
 */
-(void)deleteRoamMessageListWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId;

/**
 撤回消息，发送IQ消息
 2018-11-28JC添加
 
 @param messageType 消息类型
 @param chatId 二人会话对方的id，讨论组/项目组群id，广播消息没有删除操作
 @param packetId 消息id
 @param sendTime 时间
 */
-(void)updateWithdrawMessageListWithChatType:(ReceiptMessageType)messageType chatId:(NSString*)chatId packetId:(NSString *)packetId sendTime:(NSString *)sendTime;

@end
